MyBatis 03 |
您所在的位置:网站首页 › mybatis resultmap resulttype › MyBatis 03 |
MyBatis映射1 ORM映射1.1 MyBatis自动ORM失效1.2 方案一:列的别名1.3 方案二:直接使用Map集合映射结果1.4 方案三:自定义结果映射(ResultMap)2 MyBatis高级映射2.1 数据库中表的关系2.2 OneToOne2.2.1 方案一:返回Map2.2.2 方案二:实体类关联2.2.3 方案三:分步查询2.3 OneToMany2.3.1 方案一:返回Map2.3.2 方案二:实体类关联2.3.3 方案三:分步查询2.4 ManyToMany2.4.1 方案一:实体类关联8.4.2 方案二:分步查询
1 ORM映射
1.1 MyBatis自动ORM失效
MyBatis只能自动维护库表”列名“与”属性名“相同时的一一对应关系,二者不同时,无法自动ORM。 1.2 方案一:列的别名在SQL中使用 as 为查询字段添加列别名,以匹配属性名 select p_id pid,t_id tid,p_name name,p_time time,p_price price ,p_state state ,p_image image, p_info info,isdel del from product; 1.3 方案二:直接使用Map集合映射结果常用的java类,mybatis已经取了类型别名了 不用写成 select * from product; //解决方法2:直接返回一个Map集合 List getAll2(); 1.4 方案三:自定义结果映射(ResultMap) select * from product; 2 MyBatis高级映射全局懒加载 association 一对一的关联映射 property:实体类中属性名称(在Person类中定义的Passport属性的名称) javaType:映射对应java类型 collection:一对多的关联映射 property:关联的实体类中的集合的属性名 ofType: 集合泛型的类型 2.1 数据库中表的关系实体间的关系:关联关系 OneToOne:一对一关系(person— passport) OneToMany:一对多关系(dept— emp) 多对一(多个一对一) ManyToMany:多对多关系(student— teacher) 多个一对多 2.2 OneToOneSQL参考person表和passport表 三种实现方案 直接返回一个Map集合实体类中进行关联,mapper中做映射分步查询,实现懒加载(了解) 2.2.1 方案一:返回Map映射代码 //1、直接将连表查询的结果映射到Map中(写一个公共类(将两个表的写到一个新的类中)) (一般不推荐这样操作) List getAll1(); select * from person p INNER JOIN passport pp on p.pid = pp.id; 2.2.2 方案二:实体类关联实体类关联 @Data @AllArgsConstructor @NoArgsConstructor public class Person {private Integer id;private String name;private Integer age;private String phone;private String pid;private Passport passport; }映射代码 select p.*,pp.id p_id,pp.info,pp.fromAdd ,pp.toAdd , pp.uid from person p INNER JOIN passport pp on p.pid = pp.id; 注意:指定“一方”关系时(对象),使用< association property=“” javaType=“” > 2.2.3 方案三:分步查询实体类关联 @Data @AllArgsConstructor @NoArgsConstructor public class Person {private Integer id;private String name;private Integer age;private String phone;private String pid;private Passport passport; }映射代码 select * from person select * from passport where id = #{pid} 可以使用两次查询也可以解决 2.3 OneToManySQL参考emp表和dept表 2.3.1 方案一:返回Map //此方式不适合一对多的查询情况 2.3.2 方案二:实体类关联实体类关联 @Data @AllArgsConstructor @NoArgsConstructor public class Dept {private Integer deptno;private String dname;private String location;//一对多private List empList; }映射代码 select * from dept d INNER JOIN emp e on d.deptno = e.deptno; 2.3.3 方案三:分步查询实体类关联 @Data @AllArgsConstructor @NoArgsConstructor public class Dept {private Integer deptno;private String dname;private String location;//一对多private List empList; }映射代码 select * from dept;select * from emp where deptno = #{deptno} 注意:指定“多方”关系时(集合),使用< collection ofType=“” property=“” > 2.4 ManyToManySQL参考student表和teacher表 2.4.1 方案一:实体类关联实体类关联 @Data @AllArgsConstructor @NoArgsConstructor public class Student {private Integer id;private String name;private Double score;private List teacherList; }映射代码 select s.id sid,s.name sname , s.score score , t.* from student s INNER JOIN t_s ts on s.id = ts.sid INNER JOIN teacher t on t.id = ts.tid 8.4.2 方案二:分步查询与上面一对多的分步查询一致 注意:连表查询的时候,如果两张表有同名字段,在写sql语句的时候要取别名 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |